package gameobjects;

import org.newdawn.slick.*;

import javagame.Level;

public class Boss1 extends Protivnik {
	
	//POLJA KLASE
	private static int startHP = 100;
	
	private Image HP_bar;//bar za prikazivanje preostale snage
	private int metakSredina;//za odbrojavanje metaka za one topove sto pucaju iskosa
	private Animation blink;//animacija kada se pogodi bos
	private int brBlink;//koliko dugo da blinka
	private int metakOdbrojavanje2;
	private boolean pucaNaPrvog;
	
	//KONSTRUKTOR
	
	public Boss1(Igrac igrac, Igrac2 igrac2, Level nivo) {
		super(igrac, igrac2, nivo);
		setHP(startHP);
		setVrsta(tip_protivnika.BOSS);
		metakSredina = 1;
		brBlink = 5;
		setMetakOdbrojavanje(5);
		metakOdbrojavanje2 = 5;
		setSizeX(400);
		setSizeY(200);
		pucaNaPrvog = false;
		setTenkPomeraj(25);
		setBrojTopova(25);
		//dole desno topovi
		this.dodajTop(0, 269, 145, 0, 0, 0, 0, 0, 0);
		this.dodajTop(1, 287, 145, 0, 0, 0, 0, 0, 0);
		this.dodajTop(2, 305, 145, 0, 0, 0, 0, 0, 0);
		//dole levo topovi
		this.dodajTop(3, 95, 124, 0, 0, 0, 0, 0, 0);
		this.dodajTop(4, 113, 124, 0, 0, 0, 0, 0, 0);
		this.dodajTop(5, 131, 124, 0, 0, 0, 0, 0, 0);
		//gore desno topovi
		this.dodajTop(6, 0, 0, 269, 124, 0, 0, 0, 0);
		this.dodajTop(7, 0, 0, 287, 124, 0, 0, 0, 0);
		this.dodajTop(8, 0, 0, 305, 124, 0, 0, 0, 0);
		//gore levo topovi
		this.dodajTop(9, 0, 0, 95, 145, 0, 0, 0, 0);
		this.dodajTop(10, 0, 0, 113, 145, 0, 0, 0, 0);
		this.dodajTop(11, 0, 0, 131, 145, 0, 0, 0, 0);
		//levo topovi
		this.dodajTop(12, 0, 0, 0, 0, 0, 0, 47, 60);
		this.dodajTop(13, 0, 0, 0, 0, 0, 0, 47, 78);
		this.dodajTop(14, 0, 0, 0, 0, 0, 0, 47, 96);
		this.dodajTop(15, 0, 0, 0, 0, 0, 0, 47, 114);
		this.dodajTop(16, 0, 0, 0, 0, 0, 0, 47, 132);
		//desno topovi
		this.dodajTop(17, 0, 0, 0, 0, 353, 60, 0, 0);
		this.dodajTop(18, 0, 0, 0, 0, 353, 78, 0, 0);
		this.dodajTop(19, 0, 0, 0, 0, 353, 96, 0, 0);
		this.dodajTop(20, 0, 0, 0, 0, 353, 114, 0, 0);
		this.dodajTop(21, 0, 0, 0, 0, 353, 132, 0, 0);
		//topovi u 8 smera
		this.dodajTop(22, 156, 70, 0, 0, 0, 0, 0, 0);
		this.dodajTop(23, 200, 70, 0, 0, 0, 0, 0, 0);
		this.dodajTop(24, 244, 70, 0, 0, 0, 0, 0, 0);
	}
	
	//GET I SET METODE
	
	public Image getHP_bar() {
		return HP_bar;
	}

	public void setHP_bar(Image hPBar) {
		HP_bar = hPBar;
	}
	
	public int getMetakSredina() {
		return metakSredina;
	}

	public void setMetakSredina(int metakSredina) {
		this.metakSredina = metakSredina;
	}

	public Animation getBlink() {
		return blink;
	}

	public void setBlink(Animation blink) {
		this.blink = blink;
	}

	public int getBrBlink() {
		return brBlink;
	}

	public void setBrBlink(int brBlink) {
		this.brBlink = brBlink;
	}
		
	//TREPTANJE
	
	//pocetak treptanja
	public void startBlink() {
		this.setBlk(true);
		blink.restart();
		this.setProtivnik(blink);
	}
	
	//prestanak treptanja
	public void stopBlink() {
			if (this.getSmer() == 0) this.setProtivnik(this.getMovingDown());
			else if (this.getSmer() == 1) this.setProtivnik(this.getMovingUp());
			else if (this.getSmer() == 2) this.setProtivnik(this.getMovingRight());
			else  this.setProtivnik(this.getMovingLeft());
			brBlink = 5;
			this.setBlk(false);
	}
	
	//koliko dugo da trepce
	public void blink() {
		if(this.getProtivnik().equals(blink)) {
			brBlink--;
			if(brBlink == 0) stopBlink();
		}	
	}
	
	//KRETANJE
	
	public void move(int delta, Kolizija kolizija){
		kreciSe(delta, kolizija);
		if(!this.getNivo().mozeFull(kolizija.getObjekatList(), this.getProtivnikX(), this.getProtivnikY(), this.getSizeX(), this.getSizeY()) 
				|| !this.getNivo().mozeJa(this)
				|| !this.getNivo().mozeJaDva(this)) 
			promeniSmer(delta, kolizija);
		else promenaSmeraKrajNivoa(delta, kolizija);	
	}
	
	//PUCANJE
	
	//prepravljena metoda klase Protivnik
	public void pucanje(int index, int brTopova, boolean belo, int smer) throws SlickException {
		for(int i=0;i<brTopova;i++) {
			int j = index + i;
			//levo
			if(smer == 3) pucaj(this.getProtivnikX() + this.getKordTop(j).getSmer3X(), this.getProtivnikY() + this.getKordTop(j).getSmer3Y(), smer, belo);
			//desno
			if(smer == 2) pucaj(this.getProtivnikX() + this.getKordTop(j).getSmer2X(), this.getProtivnikY() + this.getKordTop(j).getSmer2Y(), smer, belo);
			//gore
			if(smer == 1) pucaj(this.getProtivnikX() + this.getKordTop(j).getSmer1X(), this.getProtivnikY() + this.getKordTop(j).getSmer1Y(), smer, belo);
			//dole
			if(smer == 0) pucaj(this.getProtivnikX() + this.getKordTop(j).getSmer0X(), this.getProtivnikY() + this.getKordTop(j).getSmer0Y(), smer, belo);
		}
	}
	
	//prepravljena metoda klase Protivnik
	public void firing(int smer, int index, int brTopova, boolean belo) throws SlickException {
		this.incMetakO();
		if(this.getMetakOdbrojavanje() == 0) {
			setSmer(smer);
			if(!this.isBlk()) promeniAnimaciju();
			pucanje(index, brTopova, belo, smer);
			setMetakOdbrojavanje(10);
		}
	}
	
	//prepravljena metoda klase Protivnik
	public void firing2(int smer, int index, int brTopova, boolean belo) throws SlickException {
		metakOdbrojavanje2--;
		if(metakOdbrojavanje2 == 0) {
			if(!pucaNaPrvog) setSmer(smer);
			if(!isBlk()) promeniAnimaciju();
			pucanje(index, brTopova, belo, smer);
			metakOdbrojavanje2 = 10;
		}
	}
	
	//pucanje po jednom smeru
	public void fire(boolean belo) throws SlickException {
		//dole desno
		if(this.getIgrac().isZiv()
				&& this.getProtivnikX() + 269 <= this.getIgrac().getTenkX() + this.getTenkPomeraj() 
				&& this.getProtivnikX() + 305 >= this.getIgrac().getTenkX() + this.getTenkPomeraj() 
				&& this.getProtivnikY() + 100 <= this.getIgrac().getTenkY() + this.getTenkPomeraj()) {
			setShooting(true);
			pucaNaPrvog = true;
			firing(0, 0, 3, belo);
		}
		//gore levo
		else if(this.getIgrac().isZiv()
				&& this.getProtivnikX() + 95 <= this.getIgrac().getTenkX() + this.getTenkPomeraj() 
				&& this.getProtivnikX() + 131 >= this.getIgrac().getTenkX() + this.getTenkPomeraj() 
				&& this.getProtivnikY() + 100 <= this.getIgrac().getTenkY() + this.getTenkPomeraj()) {
			setShooting(true);
			pucaNaPrvog = true;
			firing(0, 3, 3, belo);
		}
		//gore desno
		else if(this.getIgrac().isZiv()
				&& this.getProtivnikX() + 269 <= this.getIgrac().getTenkX() + this.getTenkPomeraj() 
				&& this.getProtivnikX() + 305 >= this.getIgrac().getTenkX() + this.getTenkPomeraj() 
				&& this.getProtivnikY() + 100 >= this.getIgrac().getTenkY() + this.getTenkPomeraj()) {
			setShooting(true);
			pucaNaPrvog = true;
			firing(1, 6, 3, belo);
		}
		//gore levi
		else if(this.getIgrac().isZiv()
				&& this.getProtivnikX() + 95 <= this.getIgrac().getTenkX() + this.getTenkPomeraj() 
				&& this.getProtivnikX() + 131 >= this.getIgrac().getTenkX() + this.getTenkPomeraj()  
				&& this.getProtivnikY() + 100 >= this.getIgrac().getTenkY() + this.getTenkPomeraj()) {
			setShooting(true);
			pucaNaPrvog = true;
			firing(1, 9, 3, belo);
		}
		//levo
		else if(this.getIgrac().isZiv()
				&& this.getProtivnikY() + 47 <= this.getIgrac().getTenkY() + this.getTenkPomeraj() 
				&& this.getProtivnikY() + 132 >= this.getIgrac().getTenkY() + this.getTenkPomeraj() 
				&& this.getProtivnikX() + 200 >= this.getIgrac().getTenkX() + this.getTenkPomeraj()) {
			setShooting(true);
			pucaNaPrvog = true;
			firing(3, 12, 5, belo);
		}
		//desno
		else if(this.getIgrac().isZiv()
				&& this.getProtivnikY() + 47 <= this.getIgrac().getTenkY() + this.getTenkPomeraj() 
				&& this.getProtivnikY() + 132 >= this.getIgrac().getTenkY() + this.getTenkPomeraj() 
				&& this.getProtivnikX() + 200 <= this.getIgrac().getTenkX() + this.getTenkPomeraj()) {
			setShooting(true);
			pucaNaPrvog = true;
			firing(2, 17, 5, belo);
		}
		else {
			setShooting(false);
			setStop(false);
			pucaNaPrvog = false;
		}
		if(this.isImaDvaIgraca()) {
			//dole desno
			if(this.getIgrac2().isZiv()
					&& this.getProtivnikX() + 269 <= this.getIgrac2().getTenkX() + this.getTenkPomeraj() 
					&& this.getProtivnikX() + 305 >= this.getIgrac2().getTenkX() + this.getTenkPomeraj() 
					&& this.getProtivnikY() + 100 <= this.getIgrac2().getTenkY() + this.getTenkPomeraj()) {
				setShooting2(true);
				firing2(0, 0, 3, belo);
			}
			//gore levo
			else if(this.getIgrac2().isZiv()
					&& this.getProtivnikX() + 95 <= this.getIgrac2().getTenkX() + this.getTenkPomeraj() 
					&& this.getProtivnikX() + 131 >= this.getIgrac2().getTenkX() + this.getTenkPomeraj() 
					&& this.getProtivnikY() + 100 <= this.getIgrac2().getTenkY() + this.getTenkPomeraj()) {
				setShooting2(true);
				firing2(0, 3, 3, belo);
			}
			//gore desno
			else if(this.getIgrac2().isZiv()
					&& this.getProtivnikX() + 269 <= this.getIgrac2().getTenkX() + this.getTenkPomeraj() 
					&& this.getProtivnikX() + 305 >= this.getIgrac2().getTenkX() + this.getTenkPomeraj() 
					&& this.getProtivnikY() + 100 >= this.getIgrac2().getTenkY() + this.getTenkPomeraj()) {
				setShooting2(true);
				firing2(1, 6, 3, belo);
			}
			//gore levi
			else if(this.getIgrac2().isZiv()
					&& this.getProtivnikX() + 95 <= this.getIgrac2().getTenkX() + this.getTenkPomeraj() 
					&& this.getProtivnikX() + 131 >= this.getIgrac2().getTenkX() + this.getTenkPomeraj()  
					&& this.getProtivnikY() + 100 >= this.getIgrac2().getTenkY() + this.getTenkPomeraj()) {
				setShooting2(true);
				firing2(1, 9, 3, belo);
			}
			//levo
			else if(this.getIgrac2().isZiv()
					&& this.getProtivnikY() + 47 <= this.getIgrac2().getTenkY() + this.getTenkPomeraj() 
					&& this.getProtivnikY() + 132 >= this.getIgrac2().getTenkY() + this.getTenkPomeraj() 
					&& this.getProtivnikX() + 200 >= this.getIgrac2().getTenkX() + this.getTenkPomeraj()) {
				setShooting2(true);
				firing2(3, 12, 5, belo);
			}
			//desno
			else if(this.getIgrac2().isZiv()
					&& this.getProtivnikY() + 47 <= this.getIgrac2().getTenkY() + this.getTenkPomeraj() 
					&& this.getProtivnikY() + 132 >= this.getIgrac2().getTenkY() + this.getTenkPomeraj() 
					&& this.getProtivnikX() + 200 <= this.getIgrac2().getTenkX() + this.getTenkPomeraj()) {
				setShooting2(true);
				firing2(2, 17, 5, belo);
			}
			else {
				setShooting2(false);
				setStop2(false);
			}
		}
	}
	
	//pucanje u 8 smera
	public void fire8(boolean belo) throws SlickException {
		metakSredina--;
		if(metakSredina == 0) {
			for(int i=22;i<25;i++) pucaj8(this.getProtivnikX() + this.getKordTop(i).getSmer0X(), this.getProtivnikY() + this.getKordTop(i).getSmer0Y(), belo);
			metakSredina=100;
		}
	}
	
	//BOSS AI
	
	public void protivnikAI(int delta, Kolizija kolizija, boolean belo) throws SlickException  {
		if(!this.getNivo().isPocniNivo() && this.isUbiven() == false) {
			blink();
			algoritamKretanja(delta, kolizija);
			move(delta/2, kolizija);
			fire8(belo);
			fire(belo);
		}
	}
	
	//CRTANJE
	
	//postavljanje animacije
	public void setAnimation() throws SlickException {
		Image [] up = {new Image("res/boss.png"), new Image("res/boss_gd.png")};
		Image [] down = {new Image("res/boss.png"), new Image("res/boss_gd.png")};
		Image [] left = {new Image("res/boss.png"), new Image("res/boss_ld.png")};
		Image [] right = {new Image("res/boss.png"), new Image("res/boss_ld.png")};
		Image [] blink = {new Image("res/boss_invert.png"), new Image("res/boss.png")};
		this.setMovingUp(new Animation(up, this.getDuration(), true));//true se stavlja zbog autoupdate
		this.setMovingDown(new Animation(down, this.getDuration(), true));
		this.setMovingLeft(new Animation(left, this.getDuration(), true));
		this.setMovingRight(new Animation(right, this.getDuration(), true));
		this.setBlink(new Animation(blink, this.getDuration(), true));
		this.setProtivnik(this.getMovingDown());
	}
	
	public void eksplodiraj () {
		getEksplozija().draw(getProtivnikX()+45, getProtivnikY()+30);
		getEksplozija().draw(getProtivnikX()+285, getProtivnikY()+30);
		getEksplozija().draw(getProtivnikX()+45, getProtivnikY()+80);
		getEksplozija().draw(getProtivnikX()+285, getProtivnikY()+80);
		getEksplozija().draw(getProtivnikX()+165, getProtivnikY()+55);
		getEksplozija().setLooping(false);
	}
	
	//iscrtavanje boss-a i helth bara
	public void crtaj(Graphics g) throws SlickException {
		super.crtaj(g);
		
		Color stara = g.getColor();
		g.setColor(Igrac.DARK_RED);
		g.fillRect(getProtivnikX(), getProtivnikY()-20, 400, 10);
		g.setColor(Igrac.LIME);
		g.fillRect(getProtivnikX(), getProtivnikY()-20, 400*getHP()/startHP, 10);
		g.setColor(Color.black);
		g.drawRect(getProtivnikX(), getProtivnikY()-20, 400, 10);
		g.setColor(stara);
	}
	
	public void ozivi() {
		super.ozivi();
		this.setHP(startHP);
		metakSredina = 1;
		brBlink = 5;
	}
					
}

